package com.kerbores.jfinal.config;

import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.render.ViewType;
import com.kerbores.jfinal.interceptor.LogInterceptor;
import com.kerbores.jfinal.model.Blog;
import com.kerbores.utils.annotation.ControllerKey;
import com.kerbores.utils.annotation.Table;
import com.kerbores.utils.clazz.Classs;

/**
 * @author 王贵源
 *
 *         create at 2014年9月22日 下午9:24:56
 */
public class Config extends JFinalConfig {
	/**
	 * controller包 将自动加载该包下 @ControllerKey 注解的控制器(Controller) 并生成路由
	 */
	private static final String controllerPackage = "com.kerbores.jfinal.controller";
	/**
	 * model包 将自动加载该包下 @Table 注解的类并映射数据库表
	 */
	private static final String modelPackage = "com.kerbores.jfinal.model";

	/**
	 * 全局配置
	 */
	@Override
	public void configConstant(Constants me) {
		loadPropertyFile("a_little_config.txt");
		me.setDevMode(getPropertyToBoolean("devMode", false));
		me.setViewType(ViewType.JSP);
	}

	/**
	 * handler配置
	 */
	@Override
	public void configHandler(Handlers handlers) {
		handlers.add(new ContextPathHandler("base"));// 將contextPath加入到
														// request中,便于页面的内容全部实现绝对路径避免资源加载出错
	}

	/**
	 * Interceptor配置
	 */
	@Override
	public void configInterceptor(Interceptors interceptors) {
		interceptors.add(new LogInterceptor());
		interceptors.add(new Tx());// 这样将是一个全局的事务控制
		// interceptors.add(new SessionCheckInterceptor(new String[] { "/",
		// "/index" }, "/index"));
	}

	/**
	 * plugin配置
	 */
	@Override
	public void configPlugin(Plugins me) {
		DruidPlugin plugin = new DruidPlugin(getProperty("url"), getProperty("user"), getProperty("pwd"));
		me.add(plugin);

		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(plugin);
		me.add(arp);
		// 扫包的方式加载mapping
		for (Class clazz : Classs.getClasses(modelPackage)) {
			Table table = (Table) clazz.getAnnotation(Table.class);
			if (table != null) {
				arp.addMapping(table.value(), clazz);
			} else {
				if (clazz.getSimpleName().toLowerCase().equals("package-info") || clazz.isEnum()) {
					continue;
				}
				arp.addMapping(clazz.getSimpleName().toLowerCase(), clazz);// 默认映射到类名的小写对应的表
			}
		}
		arp.addMapping("blog", Blog.class);
	}

	/**
	 * 路由配置
	 */
	@Override
	public void configRoute(Routes me) {
		// 扫包的方式进行加载 避免了重复的配置
		for (Class clazz : Classs.getClasses(controllerPackage)) {
			ControllerKey key = (ControllerKey) clazz.getAnnotation(ControllerKey.class);
			if (key != null) {
				me.add(key.value(), clazz);
			} else {
				String c = clazz.getSimpleName().toLowerCase();
				if (c.equals("package-info")) {
					continue;
				}
				me.add(c.substring(0, c.indexOf("controller")), clazz);// 如果没有配置路由将默认路由到
																		// controller的name去除controller串的位置
			}
		}
	}
}
